import pickle
from flask import Flask, render_template, session, request, redirect
# 导入配置文件
from config import Config
# 导入sqlalchemy实例
from model.db import db
# 导入蓝图
from blueprints.home import bp_home
from utils.filters import init_filters
app = Flask(__name__)
# 设置session密钥
app.secret_key = Config.secrets
# 配置数据库连接信息
# app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:root@localhost:3306'
# 创建数据库对象
# db=SQLAlchemy(app)
app.config.from_object(Config)
# 初始化sqlalchemy实例(将当前flask实例注册给sqlalchemy)
db.init_app(app)
# 注册蓝图
app.register_blueprint(bp_home, url_prefix='')
# 注册自定义模板过滤器
init_filters(app)

# @app.before_request:请求拦截器, 拦截所有请求
# @app.context_processor: 给所有模板传递公共数据
@app.context_processor
def inject_common_data():
    common_data = {}
    # 从session中读取登录信息
    user_login_info = session.get('user_login_info')
    if user_login_info:
        common_data['user_login_info'] = pickle.loads(user_login_info)
    # 此处必须有返回值: 返回值中的数据会自动传递给所有模板文件
    return common_data


# 请求拦截器,拦截未登录状态
@app.before_request
def before_request():
    # print('before_request',request.path)
    # 需要登录才有访问权限的页面路由地址
    require_login_urls = ['/ucenter', '/reset_pwd']
    if request.path in set(require_login_urls):
        # 检查登录状态
        user_login_info = session.get('user_login_info')
        # 如果没有登录
        if not user_login_info:
            # 自动跳转到登录页面
            return redirect('/login')


@app.route('/hello')
def hello_world():  # put application's code here
    return 'Hello World!!!!!'


@app.errorhandler(404)
def page_not_found(e):
    return render_template('home/404.html', error_msg=e)


if __name__ == '__main__':
    app.run()
